package linker

import (
	"risc-v/ld/pkg/utils"
)

// ReadArchiveMember 读取归档文件，即 .a 文件
// 返回一个 *File 数组包含了归档文件中所有的 .o 文件
func ReadArchiveMember(file *File) []*File {
	// 断言文件类型
	utils.Assert(GetFileType(file.Content) == FileTypeArchive)

	// archive 文件最开始的8个字节
	// !<arch>  因为是2个字节对齐的原因，所以是八个字节
	pos := 8

	var strTab []byte
	var files []*File

	// 2 字节对齐
	for len(file.Content)-pos > 1 {
		if pos%2 == 1 {
			pos++
		}

		// 读取文件头
		header := utils.Read[ArchiveSectionHeader](file.Content[pos:])
		start := pos + ArchiveSectionHeaderSize
		pos = start + header.SizeToInt() // 更新 position

		end := pos
		contents := file.Content[start:end]

		// 根据文件头判断这一部分归档文件中内内容
		if header.IsSymTab() {
			// symbol 表暂时忽略
			continue
		} else if header.IsStrTab() {
			// 字符串表 保存着归档文件中每一个 .o 文件的名字
			strTab = contents
			continue
		}

		files = append(files, &File{
			Name:    header.ReadName(strTab),
			Content: contents,
			Parent:  file,
		})
	}

	return files
}
